package com.toonan.system.service;

import java.util.List;
import java.util.Locale;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Collation;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.google.common.collect.Lists;
import com.toonan.core.constant.WebplusCons;
import com.toonan.core.matatype.Dto;
import com.toonan.core.util.WebplusMongo;
import com.toonan.core.util.WebplusUtil;
import com.toonan.core.vo.PageResult;
import com.toonan.core.vo.TreeModel;
import com.toonan.system.constant.SystemCons;
import com.toonan.system.dao.DeptDao;
import com.toonan.system.model.Dept;

/**
 * 
 * @ClassName:  DeptService   
 * @Description:TODO
 * @author: 陈骑元（chenqiyuan@toonan.com)
 * @date:   2022年2月21日 下午10:21:01     
 * @Copyright: 2022 www.toonan.com Inc. All rights reserved. 
 * 注意：本内容仅限于广州市图南软件有限公司内部传阅，禁止外泄以及用于其他的商业目
 */
@Service
public class DeptService {
	
	@Autowired
	private DeptDao deptDao;
	
	/**
	 * 
	 * 简要说明：插入一条
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月21日 下午10:33:29 
	 * @param 说明
	 * @return 说明
	 */
	public boolean insert(Dept dept) {
		dept.setIsDel(WebplusCons.WHETHER_NO);
		Dept deptDB=deptDao.insert(dept);
		if(WebplusUtil.isNotEmpty(deptDB.getDeptId())) {
			
			return true;
		}
		return false;
	}
	/**
	 * 
	 * 简要说明：更新组织机构
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月21日 下午10:26:11 
	 * @param 说明
	 * @return 说明
	 */
	public boolean updateById(Dept dept) {
		
		return deptDao.updateById(dept);
	}
	/**
	 * 
	 * 简要说明：查找组织机构
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月21日 下午10:31:59 
	 * @param 说明
	 * @return 说明
	 */
	public Dept findById(String id) {
		
		return deptDao.findById(id);
	}
	/**
	 * 
	 * 简要说明：查询当前组织机构下面数量
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月21日 下午10:28:14 
	 * @param 说明
	 * @return 说明
	 */
	public long findCountByParentId(String parentId) {
		
		Query query=WebplusMongo.eq("parentId", parentId);
		WebplusMongo.eq("isDel", WebplusCons.WHETHER_NO);
		
		
		return deptDao.count(query);
	}
	/**
	 * 
	 * 简要说明：分页查询
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月21日 下午10:45:53 
	 * @param 说明
	 * @return 说明
	 */
	public PageResult findPage(Dto pDto) {
		Query query=new Query();
		WebplusMongo.like(query, "deptName", pDto);
		WebplusMongo.llike(query, "cascadeId",pDto);
		WebplusMongo.eq(query,"isDel", WebplusCons.WHETHER_NO);
		Collation collation = Collation.of(Locale.CHINESE).numericOrdering(true);
		query.collation(collation);
		WebplusMongo.withSortAsc(query, "cascadeId");
		WebplusMongo.withSortAsc(query, "sortNo");
		PageResult pageResult=new PageResult(pDto);
		
		return deptDao.findPage(query, pageResult);
	}
	/**
	 * 
	 * 简要说明：通过父编号查询当前语义编号
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月22日 下午8:00:36 
	 * @param 说明
	 * @return 说明
	 */
	public String getCascadeId(String parentId) {
		Query query=new Query();
		WebplusMongo.eq(query, "parentId", parentId);
		Collation collation = Collation.of(Locale.CHINESE).numericOrdering(true);
		query.collation(collation);
		WebplusMongo.withSortDesc(query, "cascadeId");
		Dept subDept=deptDao.findOne(query);
		String maxCascadeId="";
		if(WebplusUtil.isNotEmpty(subDept)) {
			maxCascadeId=subDept.getCascadeId();
		}else {
			Dept parentDept=this.findById(parentId);
			if(WebplusUtil.isEmpty(parentDept)){
					maxCascadeId="0.0000";
			}else{
				maxCascadeId=parentDept.getCascadeId()+".0000";
			}
		}
		return WebplusUtil.createCascadeId(maxCascadeId, 9999);
		
	}
	/**
	 * 
	 * 
	 * 简要说明：通过父节点查询下面列表
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月22日 下午8:39:01 
	 * @param 说明
	 * @return 说明
	 */
	public List<Dept> findListByParentId(String parentId){
		Query query=new Query();
		WebplusMongo.eq(query, "parentId", parentId);
		Collation collation = Collation.of(Locale.CHINESE).numericOrdering(true);
		query.collation(collation);
		WebplusMongo.withSortAsc(query, "cascadeId");
		WebplusMongo.withSortAsc(query, "sortNo");
		
		return this.deptDao.findList(query);
	}
    /**
     * 
     * 简要说明：加载组织机构树
     * 编写者：陈骑元
     * 创建时间：2019年1月26日 下午11:07:48
     * @param 说明
     * @return 说明
     */
	public List<TreeModel> loadDeptTree(String parentId) {
		// 查询 根节点 dept=0;
		Dept rootDept = this.findById(SystemCons.TREE_ROOT_ID);
		// 如果数据库没有根节点 则创建一个根节点,并保存到数据库中
		if (WebplusUtil.isEmpty(rootDept)) {
			rootDept = new Dept();
			rootDept.setDeptId(SystemCons.TREE_ROOT_ID);
			rootDept.setParentId("-1");
			rootDept.setDeptName(SystemCons.DEPT_ROOT_NAME);
			rootDept.setIconName(SystemCons.DEPT_ROOT_ICONCLS);
			rootDept.setCascadeId(SystemCons.TREE_ROOT_CASCADE_ID);
			rootDept.setIsDel(WebplusCons.WHETHER_NO);
			rootDept.setIsAutoExpand(WebplusCons.WHETHER_YES);
			rootDept.setSortNo(1);
			rootDept.setRemark("顶级机构不能进行移动和删除操作，只能进行修改");
			rootDept.setCreateTime(WebplusUtil.getDateTime());
			this.insert(rootDept);

		}
		
		List<Dept> deptList = this.findListByParentId(parentId);
		List<TreeModel> treeModelList=Lists.newArrayList();
		for (int i = 0; i < deptList.size(); i++) {
			Dept dept = deptList.get(i);
			TreeModel treeModel = new TreeModel();
			treeModel.setId(dept.getDeptId());
			treeModel.setpId(dept.getParentId());
			treeModel.setCascadeId(dept.getCascadeId());
			treeModel.setName(dept.getDeptName());
			if(WebplusCons.WHETHER_YES.equals(dept.getIsAutoExpand())){
				treeModel.setOpen(true);//展开节点
			}else{
				treeModel.setOpen(false);//展开节点
			}
			treeModel.setChildren(null);
			treeModel.setChecked(false);
			treeModelList.add(treeModel);
		}
		return treeModelList;

	}
	
	
	/**
	 * 更新处理机构信息
	 */
	@Transactional
	public boolean updateDept(Dept dept) {
		String deptId = dept.getDeptId();
		Dept oldDept=this.findById(deptId);
		// 根节点的父节点是不存在的，因此默认为-1
		if (SystemCons.TREE_ROOT_ID.equals(deptId)) {
			dept.setParentId("-1");
		}
		String parentId = dept.getParentId();
		String parentIdOld = oldDept.getParentId();
		dept.setUpdateTime(WebplusUtil.getDateTime());
		if (!parentId.equals(parentIdOld)) { // 如果机构发生改变了，则更新子节点的语义ID
			
			String cascadeId =this.getCascadeId(parentIdOld);
			dept.setCascadeId(cascadeId);
			// 原始的语义ID
			String cascadeIdOld =oldDept.getCascadeId();
			Query query=new Query();
			WebplusMongo.leftLike(query, "cascadeId",cascadeIdOld);
			// 查询所有子节点进行更新
			List<Dept> childDeptList = this.deptDao.findList(query);
			for (Dept childDept : childDeptList) {
				String cascade_id_temp = childDept.getCascadeId();
				cascade_id_temp = cascade_id_temp.replace(cascadeIdOld, cascadeId);
				childDept.setCascadeId(cascade_id_temp);
				childDept.setUpdateTime(WebplusUtil.getDateTime());
				this.updateById(childDept);

			}
		}
		return this.updateById(dept);
	};
}
